<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // this指向问题   this的本质
    // 1.在普通函数中  this指向的是window
    // var a = 1
    // function fn1(){
    //     console.log('woshi fn1');
    // }
    // function fn(){
    //     console.log(this.a);
    //     console.log(this.fn1());
    // }
    // fn()

    // 2.在构造函数中  this  指向实例化出来的对象
    //     function Star(name,age){

    //         this.name = name
    //         this.age = age

    //         console.log(this);


    //     }
    //    let star =  new Star('刘德华',18) ///new 的作用就是实例化 
    //    console.log(star);

    //    3.在es6 class 类中 this指向 实例化出来的对象

    // class Star {
    //     constructor(val){
    //         this.name = val
    //         console.log(this);
    //     }
    // }
    // let s = new Star('张学友')  
    // console.log(s);


    //  4.在定时器中 this指向  setTimeout(function(){})  setInterval(function(){})

    // setTimeout(function(){
    //     console.log(this);
    // })
    // setInterval(function(){
    //     console.log(this);
    // })

    //   在普通里面   谁调用他他就指向谁
    // 在箭头函数中  this是不固化   this和声明箭头函数的作用域的this指向保持一致

    // let obj = {
    //     name:'任春旭',
    //     sing:function(){
    //         console.log(this); //obj
    //         setTimeout(()=>{
    //             console.log(this);//obj
    //         })
    //     }
    // }
    // obj.sing()




    // let obj = {
    //     name:'张学友'
    // }
    // function fn(name1,name2){
    //     console.log(name1,name2);
    // console.log(this);
    // }
    // fn()

    // 更改this指向   call()  apply  bind()

    // fn.apply(obj,['刘德华','梁朝伟'])
    // fn.call(obj,'刘德华','梁朝伟')

    // apply() 和call() 都能更改this指向 都会立即调用函数   
    //  apply（）后面的参数 用数组的形式进行传递
    //  call() 后面的参数  用,隔开就可以了

    // fn.bind(obj)('刘德华','梁朝伟')

    // let fun = fn.bind(obj)
    // fun('刘德华','梁朝伟')
    

    // bind()  不会立即执行 需要调用才能触发   后面的参数  用,隔开就可以了





    let obj = {
        name: '任春旭',
        sing: function () {
            console.log(this);//obj
            setTimeout(function () {
                console.log(this);
            }.bind(this), 2000)
        }
    }

    // bind() 一般和定时器搭配使用

    obj.sing()

    



















</script>

</html>